package proyectosimulacion;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.Timer;

/**
 *
 * @author Juan Camilo y Juan David
 */
public class ProyectoSimulacion{
    static Puente puente;
    static int numeroRepeticiones;
    static double numRep;
    static int tiempoSimulacion, tiempoLlegadasIzq, tiempoLlegadasDer, tiempoSemaforoIzq, tiempoSemaforoDer, aux;
    static ArrayList<Evento> LEF = new ArrayList<>();
    static int tiempo = 0, tiempoEvento, timeOut;
    static Evento evento, eventoAux;
    static Timer reloj;
    
    //static Reloj reloj;
    /*
     * @param args the command line arguments
     */
    
    public static void main(String[] args) {
        // TODO code application logic here
        ProyectoSimulacion p = new ProyectoSimulacion();
        p.obtenerDatos();
        
        numRep = (double) numeroRepeticiones;
        
        double aleatorioIzq = Math.random();
        double aleatorioDer = Math.random();
        
        System.out.println("aleatorio izq "+aleatorioIzq);
        System.out.println("aleatorio der "+aleatorioDer);
        
        tiempoLlegadasIzq = (int) Math.round(-(1/0.01)*(Math.log(aleatorioIzq))*1000);
        tiempoLlegadasDer = (int) Math.round(-(1/0.02)*(Math.log(aleatorioDer))*1000);
        
        System.out.println("tiempo izq "+tiempoLlegadasIzq);
        System.out.println("tiempo der "+tiempoLlegadasDer);
        
        puente = new Puente(tiempoSemaforoDer, tiempoSemaforoIzq, tiempoLlegadasIzq, tiempoLlegadasDer);

        LEF.add(new Evento("CCD", Integer.parseInt("0")));
        LEF.add(new Evento("CCI", Integer.parseInt("0")));
        LEF.add(new Evento("SIV", Integer.parseInt("0")));;
        aux = 120000;
        tiempoSimulacion = numeroRepeticiones * (tiempoSemaforoIzq + (2*aux) + tiempoSemaforoDer);
        System.out.println(""+tiempoSimulacion);
        LEF.add(new Evento("T", tiempoSimulacion));
        puente.run();
        reloj.start();
        
        while(!LEF.get(0).getNombre().equals("T")){
            try {
                evento = LEF.get(0);
                timeOut = evento.getTiempo() - tiempo;
                
                switch(evento.getNombre()){
                    case "SIV":
                        System.out.println("SIV T: "+(tiempo + aux + tiempoSemaforoDer));
                        LEF.add(new Evento("SIR", tiempo + aux + tiempoSemaforoIzq));
                        puente.evento_SIV();
                        LEF.remove(0);
                        ordenarLEF();
                        break;
                        
                    case "SIR":
                        System.out.println("SIR T: "+(tiempo + aux + tiempoSemaforoDer));
                        LEF.add(new Evento("SIV", tiempo + aux + tiempoSemaforoDer));
                        puente.evento_SIR();
                        LEF.remove(0);
                        ordenarLEF();
                        break;
                        
                    case "CCD":
                        puente.evento_CCD();
                        LEF.remove(0);
                        break;
                        
                    case "CCI":
                        puente.evento_CCI();
                        LEF.remove(0);
                        break;
                }
                System.out.println("LEF "+LEF.get(0).getNombre());
            } catch (InterruptedException ex) {
                Logger.getLogger(ProyectoSimulacion.class.getName()).log(Level.SEVERE, null, ex);
            }; 
        }
        puente.evento_T();
        reloj.stop();
        
        System.exit(0);
    }
    
    public void obtenerDatos(){
        numeroRepeticiones = Integer.parseInt(JOptionPane.showInputDialog("Numero de repeticiones: "));
        /*tiempoLlegadasIzq = Integer.parseInt(JOptionPane.showInputDialog("Tiempo llegadas izquierda (Ms): "));
        tiempoLlegadasDer = Integer.parseInt(JOptionPane.showInputDialog("Tiempo llegadas derecha (Ms): "));*/
        tiempoSemaforoIzq = Integer.parseInt(JOptionPane.showInputDialog("Tiempo semaforo izquierdo en verde (Seg.): "));
        tiempoSemaforoDer = Integer.parseInt(JOptionPane.showInputDialog("Tiempo semaforo derecho en verde (Seg.): "));
        tiempoSemaforoIzq *= 1000;
        tiempoSemaforoDer *= 1000;
        reloj = new javax.swing.Timer(1, new ActionListener () {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                
                tiempo++;
            } 
        });
    }
    
    public static void ordenarLEF(){
        numRep = numRep - 0.5;
        Evento aux;
        for (int i = 0; i < LEF.size(); i++) {
            for (int j = 1; j < LEF.size(); j++) {
                if (LEF.get(i).getTiempo() > LEF.get(j).getTiempo() && numRep > 0) {
                    aux = LEF.get(i);
                    LEF.set(i, LEF.get(j));
                    LEF.set(j, aux);
                    //System.out.println("i "+LEF.get(i).getNombre()+" j "+LEF.get(j).getNombre());
                }
            }
        }
    }
}